home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
pao
/
towns
/
cdplay
/
src
/
tape.c
< prev
next >
Wrap
Text File
|
1991-10-18
|
10KB
|
338 lines
/* << High C V1.4 >> **********************************************************
**
** CD PLAYER プログラム演奏モード時の録音可能テープ選択ルーチン
**
** 1991.03.26 : CREATE
** 1991.03.27 : FINISH
**
** < HISTORY >
** 1991.03.26 : CREATE
**
** < note > : TABS = 4
**
** All Rights Reserved, Copyright (C) Y.Hirata 1991.
**
** Programmed by Y.Hirata ( Nifty ID : NAB03321 )
**
******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cdpn.h"
#define _TAPE_MAIN
#include "tape.h"
#define DEF_TAPEFILE "TAPE.DEF" /* TAPE情報格納ファイル名 */
#define TAPE_MAX_MINUTE 999
#define TAPE_MIX_MINUTE 1
CDDA_TRACK Sidetime ; /* 選択したテープの片面録音可能時間 */
/**************************** テープ情報初期設定 *****************************/
int TAPE_define( void )
/*=============================================================================
** テープの種類に関する情報を、定義ファイルから読み込んで設定する.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : 設定できた時には、真値, できなかった時には、偽値.
**
** ファイル中、セミコロン「;」以降はコメントである.
=============================================================================*/
{
FILE *fp ;
char buf[128] ;
char *p ;
char *q = ", \t" ; /* コンマ,スペース,タブを区切りとする */
int ndata, data ;
char flg ;
if ( (fp=fopen( DEF_TAPEFILE,"r" )) == NULL ) {
/* ↓↓ ★★ DEBUG ★★ ↓↓ */
if ( CDDA_DEBUG ) {
printf( "can't open input file : %s\n",DEF_TAPEFILE ) ;
}
/* ↑↑ ★★ DEBUG ★★ ↑↑ */
return( FALSE ) ;
}
ndata = ZERO ;
while ( (fgets( buf,128,fp )) != NULL ) {
p = strtok( buf,q ) ;
if ( p[0] != ';' ) { /* コメント行以外 */
flg = FALSE ;
if ( p != NULL ) { /* テープ時間チェック */
data = atoi( p ) ;
if ( TAPE_MIX_MINUTE <= data && data <= TAPE_MAX_MINUTE ) {
flg = TRUE ;
}
}
if ( flg ) {
Tape[ndata] = data ;
Tapeperm[ndata] = ZERO ;
p = strtok( NULL,q ) ;
if ( p == NULL ) { /* 許容時間データなし */
;
} else if ( p[0] != ';' ) { /* コメント以外 */
data = atoi( p ) ;
Tapeperm[ndata] = data ;
}
ndata ++ ;
}
}
}
fclose( fp ) ;
if ( ndata ) { /* テープ情報あり */
Ntape = ndata ;
return( TRUE ) ;
} else { /* テープ情報なし */
return( FALSE ) ;
}
}
/**************************** テープ情報初期設定 *****************************/
void TAPE_init( void )
/*=============================================================================
** テープの種類に関する情報の初期設定を行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
=============================================================================*/
{
int defntape = 9 ; /* テープの種類 */
char deftape[] = { /* テープ時間[分] */
30, 42, 46, 54, 60, 74, 80, 90, 120
} ;
char deftapeperm[] = { /* オーバー許容時間[秒](片面) */
20, 25, 30, 35, 40, 45, 50, 55, 60
} ;
int c ;
if ( !TAPE_define() ) { /* TAPE情報取得 */
/* TAPE情報取得不可の時 */
Ntape = defntape ;
for ( c=0; c<defntape; c++ ) {
Tape[c] = deftape[c] ;
Tapeperm[c] = deftapeperm[c] ;
}
}
Tapetime = ZERO ;
Sidetime.min = Sidetime.sec = Sidetime.frame = ZERO ;
}
/******************************* テープ自動選択 ******************************/
int TAPE_tapeselect( void )
/*=============================================================================
** 録音可能テープの選択を行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : テープ選択できた時には、真値, できなければ、偽値.
=============================================================================*/
{
int c, cmp ;
if ( Playmode != SW_PROGRAM )
return( FALSE ) ; /* プログラム演奏モードでない */
if ( Flg.tape ) return( FALSE ) ; /* 既にテープ選択済 */
Tapetime = ZERO ;
Sidetime.min = Sidetime.sec = Sidetime.frame = ZERO ;
for ( c=0; c<Ntape; c++ ) {
cmp = CDDA_cmptime( Tape[c],Tapeperm[c]+Tapeperm[c],ZERO,
CDDA_TIME_music.min,
CDDA_TIME_music.sec,
CDDA_TIME_music.frame ) ;
if ( cmp > ZERO ) {
Tapetime = Tape[c] ; /* テープ標準時間 */
Sidetime.min = Tapetime / 2 ; /* 録音可能片面時間 */
Sidetime.sec = Tapeperm[c] ;
Sidetime.frame = ZERO ;
/* テープ時間が奇数の時 */
if ( Tapetime % 2 ) Sidetime.sec += 30 ;
while ( TRUE ) {
if ( Sidetime.sec >= 60 ) {
Sidetime.sec -= 60 ;
Sidetime.min ++ ;
} else {
break ;
}
}
break ;
}
}
Flg.tape = TRUE ;
return( TRUE ) ;
}
/**************************** プログラム登録曲自動選択 ************************/
int TAPE_musicselect( void )
/*=============================================================================
** 録音可能テープに対し曲の振り分けを行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : 曲の振り分けができた時には、真値, できなければ、偽値.
=============================================================================*/
{
int c, cmp ;
if ( Playmode != SW_PROGRAM )
return( FALSE ) ; /* プログラム演奏モードでない */
if ( CDDA_TOTAL_program ) return( FALSE ) ; /* 既にプログラム登録曲あり */
if ( !Flg.tape ) {
if ( !TAPE_tapeselect() ) return( FALSE ) ; /* テープ選択 NG! */
}
for ( c=CDDA_INFO_buf.start; c<=CDDA_INFO_buf.end; c++ ) {
if ( !CDDA_data_check( c ) ) { /* CD-DA ならば */
/* ●● 曲番号 ON ●● */
if ( !CDDA_switch( c ) ) { /* 登録 OK! */
/*-----------------------------------------------------------------------------
** プログラム曲の登録時には、時間表示は、TM_TR_CLOCK とする.
** また、CHECK時同様プログラム曲確認中表示である旨を フラグセット する.
** 曲の登録作業は、checkmusic() で行う.
-----------------------------------------------------------------------------*/
cmp = CDDA_cmptime( CDDA_TIME_program.min,
CDDA_TIME_program.sec,
CDDA_TIME_program.frame,
Sidetime.min,Sidetime.sec,Sidetime.frame ) ;
if ( cmp > ZERO ) { /* 片面時間オーバー */
CDDA_switch( CDDA_SW_PRG_CLEAR ) ;
} else {
Timemode = TM_TR_CLOCK ;
Flg.prgchk = TRUE ;
checkmusic( c ) ;
disptime( c,Timemode ) ;
dispprogramtime() ;
}
} /* 登録 OK の時 */
} /* 音楽曲の時 */
} /* for loop */
return( TRUE ) ;
}
/***************************** 選択テープの確認 ******************************/
int TAPE_check( void )
/*=============================================================================
** 録音可能テープの確認を行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : テープの変更ありならば、真値, なしならば、偽値.
**
** プログラム演奏モード時に、テープ選択がされている時だけ処理を行う.
=============================================================================*/
{
int c, cmp ;
char sidea ;
int tape ;
if ( Playmode != SW_PROGRAM )
return( FALSE ) ; /* プログラム演奏モードでない */
if ( !Flg.tape ) return( FALSE ) ; /* テープ選択がされていない */
if ( !CDDA_TOTAL_program ) {
if ( !TAPE_musicselect() ) return( FALSE ) ; /* 曲選択 NG! */
}
tape = Tapetime ;
/*-----------------------------------------------------------------------------
** テープ変更の必要ありかどうかチェックする.
-----------------------------------------------------------------------------*/
cmp = CDDA_cmptime( CDDA_TIME_program.min,
CDDA_TIME_program.sec,
CDDA_TIME_program.frame,
CDDA_TIME_program2.min,
CDDA_TIME_program2.sec,
CDDA_TIME_program2.frame ) ;
if ( cmp > ZERO ) { /* Side A > side B */
sidea = TRUE ;
} else {
sidea = FALSE ;
}
/*-----------------------------------------------------------------------------
** テープ変更の必要あり.
-----------------------------------------------------------------------------*/
Tapetime = ZERO ;
Sidetime.min = Sidetime.sec = Sidetime.frame = ZERO ;
for ( c=0; c<Ntape; c++ ) {
Tapetime = Tape[c] ;
Sidetime.min = Tapetime / 2 ;
Sidetime.sec = Tapeperm[c] ;
Sidetime.frame = ZERO ;
/* テープ時間が奇数の時 */
if ( Tapetime % 2 ) Sidetime.sec += 30 ;
while ( TRUE ) {
if ( Sidetime.sec >= 60 ) {
Sidetime.sec -= 60 ;
Sidetime.min ++ ;
} else {
break ;
}
}
if ( sidea ) {
cmp = CDDA_cmptime( Sidetime.min,Sidetime.sec,Sidetime.frame,
CDDA_TIME_program.min,
CDDA_TIME_program.sec,
CDDA_TIME_program.frame ) ;
} else {
cmp = CDDA_cmptime( Sidetime.min,Sidetime.sec,Sidetime.frame,
CDDA_TIME_program2.min,
CDDA_TIME_program2.sec,
CDDA_TIME_program2.frame ) ;
}
if ( cmp >= ZERO ) { /* Tape(片面) >= 選択片面 */
break ;
} else {
Tapetime = ZERO ;
Sidetime.min = Sidetime.sec = Sidetime.frame = ZERO ;
}
}
if ( Tapetime == ZERO ) return( FALSE ) ;
if ( Tapetime == tape ) { /* テープ変更 NG */
return( FALSE ) ;
} else { /* テープ変更 OK! */
return( TRUE ) ;
}
}
/****************************** テープ自動選択 *******************************/
void TAPE_autoselect( void )
/*=============================================================================
** 録音可能テープの選択および曲の振り分けを行う.
**
** < INPUT > : なし
** < OUTPUT > : なし
** < RETURN > : なし
**
** テープ未選択時に限り、処理を行う.
** また、プログラム演奏モードで一曲も登録されていない時だけ自動選択を行う.
=============================================================================*/
{
if ( Playmode != SW_PROGRAM ) return ; /* プログラム演奏モードでない */
if ( Flg.tape ) return ; /* 既にテープ選択済 */
if ( CDDA_NOW_status != CDDA_STAT_STOP )
return ; /* 停止中でない */
if ( CDDA_TOTAL_program > ZERO ) return ; /* 既にプログラム登録曲あり */
/*-----------------------------------------------------------------------------
** テープ未選択時だけ
-----------------------------------------------------------------------------*/
TAPE_tapeselect() ;
while ( TAPE_check() ) ;
}